'''
用例对应的excel测试用例: addGoodClass>goodClass.xlsx
用例对应的keywords：keywords>addGoodClass.py
'''
import time
import unittest
import warnings
from common.browserManager import browser
from keywords.addGoodClass import AddGoodClass
from common.loggeManager import loggerM
from ddt import ddt
from ddt import data,unpack
from common.excel_util import CaseExcelUtils

@ddt
class TestDemo(unittest.TestCase):
    ceu = CaseExcelUtils("addGoodClass","goodClass")  #创建一个获取excel用例的对象

    def setUp(self) -> None:
        warnings.simplefilter("ignore", ResourceWarning)  #忽略警告
        self.driver = browser.get_driver()
        self.ac = AddGoodClass(self.driver)
        self.ac.open("http://106.14.72.167/index.php?controller=systemadmin&action=index")

    def tearDown(self) -> None:
        self.driver.quit()

    # @parameterized.expand(ceu.get_case_data())
    '''
    [
        [
            'case-输入正确的数据',  #用例的标题
            2,  #用例标题所在的行数
            ['', '', 'category_save'], #预期结果
            [ #测试步骤
                ('ht_login', 'admin,123456'), 
                ('go_to_good_class',), 
                ('input_all',), 
                ('click_确定',), 
                ('assert_by_url', 'url')
            ]
        ], 
        [
            'case-分类名称为空或空格时，提示是否正确', 
            8, 
            ['class name', 'invalid-msg', '分类名称不能为空'], 
            [
                ('ht_login', 'admin,123456'), 
                ('go_to_good_class',), 
                ('input_all',), 
                ('input_分类名称', '  '), 
                ('click_确定',), 
                ('assert_by_elem_text', 'text')
            ]
        ]
    ]
      '''
    @unpack
    @data(*ceu.get_case_data(1)) #1表示读取第一个sheet表单数据
    def test01(self,case_name:"用例名称",row:"用例名所在行号",hope:"预期结果",steps:"测试步骤"):
        loggerM.info("开始执行测试用例%s---->start" % case_name)
        str_time = time.strftime("%Y_%m_%d:%H_%M_%S") #获取当前的时间字符串
        self.ceu.write_case_time(row,str_time)  #写入执行的时间

        for step in steps:
            key = step[0].lower() # 获取关键字
            try:
                if hasattr(self.ac,key):
                    f = getattr(self.ac, key) #获取关键字对应的方法的引用
                    if len(step) > 1:  # 如果获取的用例步骤的长度大于1，则表示需要传入内容
                        if step[1] == 'text' or step[1]=='url' or step[1]=='title':
                            #表示执行断言的操作
                            f(*hope)
                        else: #如果是其它的方法，则按照下面的方法运行
                            f(step[1])
                    else: #如果用例步骤的长度小于1，则表示不需要传入内容（也肯定不是断言）
                        f()
            except: #判断是否执行失败，如果失败，则写入到excel中
                self.ceu.write_case_result(row, "fail")
                loggerM.info("测试用例%s执行结束----->end" % case_name)
                raise

        self.ceu.write_case_result(row,"pass")  #如果没有抛出异常，则执行，并记录通过
        loggerM.info("测试用例%s执行结束----->end" % case_name)

if __name__ == '__main__':
    unittest.main()
